const jwt = require("jsonwebtoken");
const md5 = require("md5");
const multer = require("multer");
const path = require("path");
const toc = require("markdown-toc");

// 格式化要响应的数据
module.exports.formatResponse = function(code, msg, data) {
  return {
    "code": code,
    "msg": msg,
    "data": data,
  }
}

// 解析token
module.exports.analysisToken = function(token) {
  return jwt.verify(token.split(" ")[1], md5(process.env.JWT_SECRET));
}

// 处理数组类型的响应数据
module.exports.handleDataPattern = function (data) {
  const arr = [];
  for (const item of data) {
    arr.push(item.dataValues);
  }
  return arr;
}

// 设置上传的引擎
const storage = multer.diskStorage({
  // 文件存储的位置
  destination: function (req, file, cb) {
    cb(null, __dirname + '/../public/static/uploads');
  },
  // 上传到服务器的文件名
  filename: function (req, file, cb) {
    // 获取文件名
    const basename = path.basename(file.originalname, path.extname(file.originalname));
    // 获取后缀名
    const extname = path.extname(file.originalname)
    // 构建新的名称
    cb(null, basename + '-' + Date.now() + extname);
  }
})
module.exports.uploading = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 2,
    files: 1
  }
});

// 处理TOC
module.exports.handleTOC = function (info) {
  let result = toc(info.morkdownContent).json;
  console.log(result)
  // 经过markdown-toc包的toc方法的处理，就将整个markdown里面的标题全部提取出来了
  // 形成一个数组，数组里面是一个个对象，每个对象记录了标题的名称以及等级
  // 对上面的数据进行一个转换
  function transfer(flatArr) {
    const stack = [];
    const result = [];
    
    /**
     * 创建toc对象
     * @param {*} item 
     * @returns 
     */
    function createTOCItem(item) {
      return {
        name: item.content,
        anchor: item.slug,
        level: item.lvl,
        children: []
      }
    }

    function handleItem(item) {
      // 获取stack栈顶的元素
      const top = stack[stack.length - 1];
      if(!top) {
        stack.push(item);
      } else if(item.level > top.level) {
        // 当前的toc对象的等级比栈顶的等级大
        // 当前这个toc对象是上一个toc对象的子元素
        top.children.push(item);
        stack.push(item);
      } else {
        stack.pop();
        handleItem(item)
      }
    }
    let min = 6; // 标题最小的级别
    // 该for循环用于寻找当前数组中最小的标题等级
    for(const i of flatArr) {
      if(i.lvl < min) {
        min = i.lvl;
      }
    }
    for(const item of flatArr) {
      const tocItem = createTOCItem(item);
      if(tocItem.level === min) {
        // 当前toc对象已经是最低的等级，不会作为其他对象的children
        result.push(tocItem);
      }
      handleItem(tocItem);
    }
    return result;
  }
  info.toc = transfer(result);
  delete info.markdownContent;

  // 把各个级别的标题添加上id
  for (const item of result) {
    switch(item.lvl) {
      case 1: {
        var newStr = `<h1 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h1>', newStr);
      }
      case 2: {
        var newStr = `<h2 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h2>', newStr);
      }
      case 3: {
        var newStr = `<h3 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h3>', newStr);
      }
      case 4: {
        var newStr = `<h4 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h4>', newStr);
      }
      case 5: {
        var newStr = `<h5 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h5>', newStr);
      }
      case 6: {
        var newStr = `<h6 id="${item.slug}">`;
        info.htmlContent = info.htmlContent.replace('<h6>', newStr);
      }
    }
  }
  return info;
}